Browse Source

Merge pull request #41235 from akien-mga/3.2-cherrypicks

Cherry-picks for the 3.2 branch (future 3.2.3) - 6th batch
Rémi Verschelde 5 years ago
parent
commit
13a615bd9c

+ 5 - 4
.mailmap

@@ -2,10 +2,6 @@ Alexander Holland <[email protected]>
 Alexander Holland <[email protected]> <[email protected]>
 Alexander Holland <[email protected]> <AlexHolly>
 Andrea Catania <[email protected]>
-Andreas Haas <[email protected]>
-Andreas Haas <[email protected]> <[email protected]>
-Andreas Haas <[email protected]> <[email protected]>
-Andreas Haas <[email protected]> <[email protected]>
 Anish Bhobe <[email protected]>
 Anutrix <[email protected]>
 Aren Villanueva <[email protected]> <[email protected]>
@@ -69,6 +65,11 @@ Kelly Thomas <[email protected]>
 K. S. Ernest (iFire) Lee <[email protected]>
 Leon Krause <[email protected]> <[email protected]>
 Leon Krause <[email protected]> <[email protected]>
+Liz Haas <[email protected]>
+Liz Haas <[email protected]> <[email protected]>
+Liz Haas <[email protected]> <[email protected]>
+Liz Haas <[email protected]> <[email protected]>
+Liz Haas <[email protected]> <[email protected]>
 Manuel Strey <[email protected]>
 Marcelo Fernandez <[email protected]>
 Marcin Zawiejski <[email protected]>

+ 7 - 2
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)

+ 129 - 91
DONORS.md

@@ -12,26 +12,35 @@ generous deed immortalized in the next stable release of Godot Engine.
 
 ## Platinum sponsors
 
+    Gamblify <https://www.gamblify.com>
     Heroic Labs <https://heroiclabs.com>
     Interblock <http://interblockgaming.com>
 
 ## Gold sponsors
 
-    Gamblify <https://www.gamblify.com>
+    None currently, become one! <https://godotengine.org/donate>
+
+## Silver sponsors
+
     Moonwards <https://www.moonwards.com>
 
+## 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

+ 30 - 24
README.md

@@ -1,25 +1,29 @@
-[![Godot Engine logo](/logo.png)](https://godotengine.org)
+# Godot Engine
 
-## Godot Engine
+<p align="center">
+  <a href="https://godotengine.org">
+    <img src="logo.svg" width="400" alt="Godot Engine logo">
+  </a>
+</p>
 
-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)

+ 4 - 3
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

+ 13 - 2
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",

+ 3 - 1
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);

+ 2 - 1
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"]);
 			}

+ 2 - 2
doc/classes/Array.xml

@@ -99,7 +99,7 @@
 			<return type="Variant">
 			</return>
 			<description>
-				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.
 			</description>
 		</method>
 		<method name="bsearch">
@@ -192,7 +192,7 @@
 			<return type="Variant">
 			</return>
 			<description>
-				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.
 			</description>
 		</method>
 		<method name="has">

+ 1 - 0
doc/classes/BitMap.xml

@@ -60,6 +60,7 @@
 			<argument index="1" name="rect" type="Rect2">
 			</argument>
 			<description>
+				Applies morphological dilation to the bitmap. The first argument is the dilation amount, Rect2 is the area where the dilation will be applied.
 			</description>
 		</method>
 		<method name="opaque_to_polygons" qualifiers="const">

+ 1 - 1
doc/classes/Engine.xml

@@ -34,7 +34,7 @@
 			</return>
 			<description>
 				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]}
 			</description>
 		</method>
 		<method name="get_frames_drawn">

+ 22 - 0
doc/classes/JSON.xml

@@ -30,6 +30,28 @@
 			<description>
 				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]
 			</description>
 		</method>
 	</methods>

+ 3 - 0
doc/classes/Node.xml

@@ -925,6 +925,9 @@
 		<constant name="NOTIFICATION_INTERNAL_PHYSICS_PROCESS" value="26">
 			Notification received every frame when the internal physics process flag is set (see [method set_physics_process_internal]).
 		</constant>
+		<constant name="NOTIFICATION_POST_ENTER_TREE" value="27">
+			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.
+		</constant>
 		<constant name="NOTIFICATION_WM_MOUSE_ENTER" value="1002">
 			Notification received from the OS when the mouse enters the game window.
 			Implemented on desktop and web platforms.

+ 2 - 1
doc/classes/Vector2.xml

@@ -33,7 +33,8 @@
 			<return type="float">
 			</return>
 			<description>
-				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].
 			</description>
 		</method>

+ 1 - 1
drivers/unix/os_unix.cpp

@@ -347,7 +347,7 @@ Error OS_Unix::execute(const String &p_path, const List<String> &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) {

+ 5 - 2
editor/editor_about.cpp

@@ -162,12 +162,15 @@ EditorAbout::EditorAbout() {
 	List<String> 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

+ 4 - 0
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);
 }

+ 6 - 2
editor/plugins/script_editor_plugin.cpp

@@ -1892,14 +1892,18 @@ void ScriptEditor::_update_script_names() {
 		Vector<String> disambiguated_script_names;
 		Vector<String> 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<EditorHelp>(tab_container->get_child(i));

+ 3 - 3
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) {

+ 5 - 5
misc/dist/linux/x-godot-project.xml

@@ -1,8 +1,8 @@
 <?xml version="1.0"?>
- <mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
-   <mime-type type="application/x-godot-project">
-   <comment>Godot Engine project</comment>
-   <icon name="godot" />
-   <glob pattern="*.godot" weight="100" />
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+  <mime-type type="application/x-godot-project">
+    <comment>Godot Engine project</comment>
+    <icon name="godot" />
+    <glob pattern="*.godot" weight="100" />
   </mime-type>
 </mime-info>

+ 0 - 177
misc/scons/compilation_db.py

@@ -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

+ 23 - 18
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();

+ 25 - 55
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);
+		this.initView();
+	}
 
-		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);
-			}
-		});
+	public GodotEditText(final Context context, final AttributeSet attrs) {
+		super(context, attrs);
+		this.initView();
 	}
 
-	public void onInitView() {
-		mKeyboardWindow.showAtLocation(mView, Gravity.NO_GRAVITY, 0, 0);
+	public GodotEditText(final Context context, final AttributeSet attrs, final int defStyle) {
+		super(context, attrs, defStyle);
+		this.initView();
 	}
 
-	public void onDestroyView() {
-		mKeyboardWindow.dismiss();
+	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
 	// ===========================================================

BIN
platform/android/logo.png


BIN
platform/iphone/logo.png


BIN
platform/osx/logo.png


+ 3 - 3
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);

+ 1 - 1
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<Font> cfont = _find_font(it);
 	if (cfont.is_null())

+ 1 - 0
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);