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

Cherry-picks for the 3.2 branch (future 3.2.3) - 6th batch
This commit is contained in:
Rémi Verschelde 2020-08-14 00:42:25 +02:00 committed by GitHub
commit 13a615bd9c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
29 changed files with 302 additions and 400 deletions

View file

@ -2,10 +2,6 @@ Alexander Holland <alexander.holland@live.de>
Alexander Holland <alexander.holland@live.de> <alexander.holland@haw-hamburg.de> Alexander Holland <alexander.holland@live.de> <alexander.holland@haw-hamburg.de>
Alexander Holland <alexander.holland@live.de> <AlexHolly> Alexander Holland <alexander.holland@live.de> <AlexHolly>
Andrea Catania <info@andreacatania.com> Andrea Catania <info@andreacatania.com>
Andreas Haas <liu.gam3@gmail.com>
Andreas Haas <liu.gam3@gmail.com> <hinsbart@gmail.com>
Andreas Haas <liu.gam3@gmail.com> <hinsbart@users.noreply.github.com>
Andreas Haas <liu.gam3@gmail.com> <entenflugstuhl@gmail.com>
Anish Bhobe <anishbhobe@hotmail.com> Anish Bhobe <anishbhobe@hotmail.com>
Anutrix <numaanzaheerahmed@yahoo.com> Anutrix <numaanzaheerahmed@yahoo.com>
Aren Villanueva <arenvillanueva@yomogi-soft.com> <aren@displaysweet.com> Aren Villanueva <arenvillanueva@yomogi-soft.com> <aren@displaysweet.com>
@ -69,6 +65,11 @@ Kelly Thomas <kelly.thomas@hotmail.com.au>
K. S. Ernest (iFire) Lee <ernest.lee@chibifire.com> K. S. Ernest (iFire) Lee <ernest.lee@chibifire.com>
Leon Krause <lk@leonkrause.com> <eska@eska.me> Leon Krause <lk@leonkrause.com> <eska@eska.me>
Leon Krause <lk@leonkrause.com> <eska014@users.noreply.github.com> Leon Krause <lk@leonkrause.com> <eska014@users.noreply.github.com>
Liz Haas <27thLiz@gmail.com>
Liz Haas <27thLiz@gmail.com> <liu.gam3@gmail.com>
Liz Haas <27thLiz@gmail.com> <hinsbart@gmail.com>
Liz Haas <27thLiz@gmail.com> <hinsbart@users.noreply.github.com>
Liz Haas <27thLiz@gmail.com> <entenflugstuhl@gmail.com>
Manuel Strey <manuel.strey@gmx.de> Manuel Strey <manuel.strey@gmx.de>
Marcelo Fernandez <marcelofg55@gmail.com> Marcelo Fernandez <marcelofg55@gmail.com>
Marcin Zawiejski <dragmz@gmail.com> Marcin Zawiejski <dragmz@gmail.com>

View file

@ -32,7 +32,6 @@ name is available.
Alexey Khoroshavin (allkhor) Alexey Khoroshavin (allkhor)
Alket Rexhepi (alketii) Alket Rexhepi (alketii)
Andrea Catania (AndreaCatania) Andrea Catania (AndreaCatania)
Andreas Haas (Hinsbart)
Andrii Doroshenko (Xrayez) Andrii Doroshenko (Xrayez)
Andy Moss (MillionOstrich) Andy Moss (MillionOstrich)
Anish Bhobe (KidRigger) Anish Bhobe (KidRigger)
@ -97,6 +96,7 @@ name is available.
Jakub Grzesik (kubecz3k) Jakub Grzesik (kubecz3k)
James Buck (jbuck3) James Buck (jbuck3)
Jérôme Gully (Nutriz) Jérôme Gully (Nutriz)
Jia Jun Chai (SkyLucilfer)
Joan Fons Sanchez (JFonS) Joan Fons Sanchez (JFonS)
Johan Manuel (29jm) Johan Manuel (29jm)
Joshua Grams (JoshuaGrams) Joshua Grams (JoshuaGrams)
@ -107,7 +107,8 @@ name is available.
Kostadin Damyanov (Max-Might) Kostadin Damyanov (Max-Might)
K. S. Ernest (iFire) Lee (fire) K. S. Ernest (iFire) Lee (fire)
lawnjelly lawnjelly
Leon Krause (eska014) Leon Krause (leonkrause)
Liz Haas (27thLiz)
Lucien Menassol (Kanabenki) Lucien Menassol (Kanabenki)
m4nu3lf m4nu3lf
Maganty Rushyendra (mrushyendra) Maganty Rushyendra (mrushyendra)
@ -134,6 +135,7 @@ name is available.
muiroc muiroc
Nathan Warden (NathanWarden) Nathan Warden (NathanWarden)
Nils André-Chang (NilsIrl) Nils André-Chang (NilsIrl)
Noah Beard (TwistedTwigleg)
Nuno Donato (nunodonato) Nuno Donato (nunodonato)
Ovnuniarchos Ovnuniarchos
Pascal Richter (ShyRed) Pascal Richter (ShyRed)
@ -157,12 +159,15 @@ name is available.
Robin Hübner (profan) Robin Hübner (profan)
romulox-x romulox-x
Ruslan Mustakov (endragor) Ruslan Mustakov (endragor)
Ryan Roden-Corrent (rrcore)
Saniko (sanikoyes) Saniko (sanikoyes)
santouits santouits
SaracenOne SaracenOne
Sergey Minakov (naithar)
sersoong sersoong
Shiqing (kawa-yoiko) Shiqing (kawa-yoiko)
Simon Wenner (swenner) Simon Wenner (swenner)
Stijn Hinlopen (hinlopen)
Swarnim Arun (minraws) Swarnim Arun (minraws)
Thakee Nathees (ThakeeNathees) Thakee Nathees (ThakeeNathees)
Theo Hallenius (TheoXD) Theo Hallenius (TheoXD)

218
DONORS.md
View file

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

View file

@ -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 ## Free, open source and community-driven
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
Godot is completely free and open source under the very permissive MIT license. 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 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 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 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. not-for-profit.
Before being open sourced in February 2014, Godot had been developed by Juan 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) ![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 Official binaries for the Godot editor and the export templates can be found
[on the homepage](https://godotengine.org/download). [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/) [See the official docs](https://docs.godotengine.org/en/latest/development/compiling/)
for compilation instructions for every supported platform. 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 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). 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 To get in touch with the engine developers, the best way is to join the
[#godotengine IRC channel](https://webchat.freenode.net/?channels=godotengine) [#godotengine-devel IRC channel](https://webchat.freenode.net/?channels=godotengine-devel)
on Freenode. on Freenode.
To get started contributing to the project, see the [contributing guide](CONTRIBUTING.md). 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). 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). 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/) 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) The official demos are maintained in their own [GitHub repository](https://github.com/godotengine/godot-demo-projects)
as well. as well.
There are also a number of other learning resources provided by the community, There are also a number of other
such as text and video tutorials, demos, etc. Consult the [community channels](https://godotengine.org/community) [learning resources](https://docs.godotengine.org/en/latest/community/tutorials.html)
for more info. 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) [![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) [![Code Triagers Badge](https://www.codetriage.com/godotengine/godot/badges/users.svg)](https://www.codetriage.com/godotengine/godot)

View file

@ -298,9 +298,10 @@ if selected_platform in platform_list:
from SCons import __version__ as scons_raw_version from SCons import __version__ as scons_raw_version
scons_ver = env._get_major_minor_revision(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"]) if scons_ver >= (4, 0, 0):
env.Alias("compiledb", env.CompilationDatabase("compile_commands.json")) env.Tool("compilation_db")
env.Alias("compiledb", env.CompilationDatabase())
if env["dev"]: if env["dev"]:
env["verbose"] = True env["verbose"] = True

View file

@ -86,10 +86,21 @@ def make_authors_header(target, source, env):
def make_donors_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 = [ sections_id = [
"DONORS_SPONSOR_PLAT", "DONORS_SPONSOR_PLATINUM",
"DONORS_SPONSOR_GOLD", "DONORS_SPONSOR_GOLD",
"DONORS_SPONSOR_SILVER",
"DONORS_SPONSOR_BRONZE",
"DONORS_SPONSOR_MINI", "DONORS_SPONSOR_MINI",
"DONORS_GOLD", "DONORS_GOLD",
"DONORS_SILVER", "DONORS_SILVER",

View file

@ -163,8 +163,10 @@ Array Engine::get_copyright_info() const {
Dictionary Engine::get_donor_info() const { Dictionary Engine::get_donor_info() const {
Dictionary donors; 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["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["mini_sponsors"] = array_from_info(DONORS_SPONSOR_MINI);
donors["gold_donors"] = array_from_info(DONORS_GOLD); donors["gold_donors"] = array_from_info(DONORS_GOLD);
donors["silver_donors"] = array_from_info(DONORS_SILVER); donors["silver_donors"] = array_from_info(DONORS_SILVER);

View file

@ -31,6 +31,7 @@
#include "script_language.h" #include "script_language.h"
#include "core/core_string_names.h" #include "core/core_string_names.h"
#include "core/io/resource_loader.h"
#include "core/os/file_access.h" #include "core/os/file_access.h"
#include "core/project_settings.h" #include "core/project_settings.h"
@ -167,7 +168,7 @@ void ScriptServer::init_languages() {
for (int i = 0; i < script_classes.size(); i++) { for (int i = 0; i < script_classes.size(); i++) {
Dictionary c = script_classes[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; continue;
add_global_class(c["class"], c["base"], c["language"], c["path"]); add_global_class(c["class"], c["base"], c["language"], c["path"]);
} }

View file

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

View file

@ -60,6 +60,7 @@
<argument index="1" name="rect" type="Rect2"> <argument index="1" name="rect" type="Rect2">
</argument> </argument>
<description> <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> </description>
</method> </method>
<method name="opaque_to_polygons" qualifiers="const"> <method name="opaque_to_polygons" qualifiers="const">

View file

@ -34,7 +34,7 @@
</return> </return>
<description> <description>
Returns a Dictionary of Arrays of donor names. 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> </description>
</method> </method>
<method name="get_frames_drawn"> <method name="get_frames_drawn">

View file

@ -30,6 +30,28 @@
<description> <description>
Converts a [Variant] var to JSON text and returns the result. Useful for serializing data to store or send over the network. 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. [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> </description>
</method> </method>
</methods> </methods>

View file

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

View file

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

View file

@ -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]); execvp(p_path.utf8().get_data(), &args[0]);
// still alive? something failed.. // still alive? something failed..
fprintf(stderr, "**ERROR** OS_Unix::execute - Could not create child process while executing: %s\n", p_path.utf8().get_data()); 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) { if (p_blocking) {

View file

@ -162,12 +162,15 @@ EditorAbout::EditorAbout() {
List<String> donor_sections; List<String> donor_sections;
donor_sections.push_back(TTR("Platinum Sponsors")); donor_sections.push_back(TTR("Platinum Sponsors"));
donor_sections.push_back(TTR("Gold 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("Mini Sponsors"));
donor_sections.push_back(TTR("Gold Donors")); donor_sections.push_back(TTR("Gold Donors"));
donor_sections.push_back(TTR("Silver Donors")); donor_sections.push_back(TTR("Silver Donors"));
donor_sections.push_back(TTR("Bronze Donors")); donor_sections.push_back(TTR("Bronze Donors"));
const char *const *donor_src[] = { DONORS_SPONSOR_PLAT, DONORS_SPONSOR_GOLD, const char *const *donor_src[] = { DONORS_SPONSOR_PLATINUM, DONORS_SPONSOR_GOLD,
DONORS_SPONSOR_MINI, DONORS_GOLD, DONORS_SILVER, DONORS_BRONZE }; 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)); tc->add_child(_populate_list(TTR("Donors"), donor_sections, donor_src, 3));
// License // License

View file

@ -1885,6 +1885,10 @@ EditorPropertyTransform::EditorPropertyTransform() {
////////////// COLOR PICKER ////////////////////// ////////////// COLOR PICKER //////////////////////
void EditorPropertyColor::_color_changed(const Color &p_color) { 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); emit_changed(get_edited_property(), p_color, "", true);
} }

View file

@ -1892,15 +1892,19 @@ void ScriptEditor::_update_script_names() {
Vector<String> disambiguated_script_names; Vector<String> disambiguated_script_names;
Vector<String> full_script_paths; Vector<String> full_script_paths;
for (int j = 0; j < sedata.size(); j++) { 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); full_script_paths.push_back(sedata[j].tooltip);
} }
EditorNode::disambiguate_filenames(full_script_paths, disambiguated_script_names); EditorNode::disambiguate_filenames(full_script_paths, disambiguated_script_names);
for (int j = 0; j < sedata.size(); j++) { for (int j = 0; j < sedata.size(); j++) {
if (sedata[j].name.ends_with("(*)")) {
sedata.write[j].name = disambiguated_script_names[j] + "(*)";
} else {
sedata.write[j].name = disambiguated_script_names[j]; sedata.write[j].name = disambiguated_script_names[j];
} }
}
EditorHelp *eh = Object::cast_to<EditorHelp>(tab_container->get_child(i)); EditorHelp *eh = Object::cast_to<EditorHelp>(tab_container->get_child(i));
if (eh) { if (eh) {

View file

@ -895,17 +895,17 @@ void TileMapEditor::_draw_cell(Control *p_viewport, int p_cell, const Point2i &p
rect.position += tile_ofs; rect.position += tile_ofs;
} }
rect.position = p_xform.xform(rect.position);
rect.size *= sc;
Color modulate = node->get_tileset()->tile_get_modulate(p_cell); Color modulate = node->get_tileset()->tile_get_modulate(p_cell);
modulate.a = 0.5; 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()) { if (r.has_no_area()) {
p_viewport->draw_texture_rect(t, rect, false, modulate, p_transpose); p_viewport->draw_texture_rect(t, rect, false, modulate, p_transpose);
} else { } else {
p_viewport->draw_texture_rect_region(t, rect, r, modulate, p_transpose); 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) { 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) {

View file

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

View file

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

View file

@ -53,6 +53,8 @@ import android.content.SharedPreferences.Editor;
import android.content.pm.ConfigurationInfo; import android.content.pm.ConfigurationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.Sensor; import android.hardware.Sensor;
import android.hardware.SensorEvent; import android.hardware.SensorEvent;
import android.hardware.SensorEventListener; import android.hardware.SensorEventListener;
@ -73,6 +75,7 @@ import android.view.Surface;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup.LayoutParams;
import android.view.ViewTreeObserver;
import android.view.Window; import android.view.Window;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.Button; import android.widget.Button;
@ -245,8 +248,6 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe
public GodotView mView; public GodotView mView;
private boolean godot_initialized = false; private boolean godot_initialized = false;
private GodotEditText mEditText;
private SensorManager mSensorManager; private SensorManager mSensorManager;
private Sensor mAccelerometer; private Sensor mAccelerometer;
private Sensor mGravity; 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)); layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
setContentView(layout); 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); mView = new GodotView(this, xrMode, use_gl3, use_32_bits, use_debug_opengl);
layout.addView(mView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); layout.addView(mView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
edittext.setView(mView);
io.setEdit(edittext);
mEditText = new GodotEditText(this, mView); mView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
io.setEdit(mEditText); @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; final String[] current_command_line = command_line;
mView.queueEvent(new Runnable() { mView.queueEvent(new Runnable() {
@ -552,7 +571,6 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe
super.onCreate(icicle); super.onCreate(icicle);
Window window = getWindow(); Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
mClipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); mClipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
pluginRegistry = GodotPluginRegistry.initializePluginRegistry(this); pluginRegistry = GodotPluginRegistry.initializePluginRegistry(this);
@ -691,21 +709,8 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe
initializeGodot(); initializeGodot();
} }
@Override
protected void onStart() {
super.onStart();
mView.post(new Runnable() {
@Override
public void run() {
mEditText.onInitView();
}
});
}
@Override @Override
protected void onDestroy() { protected void onDestroy() {
mEditText.onDestroyView();
for (int i = 0; i < singleton_count; i++) { for (int i = 0; i < singleton_count; i++) {
singletons[i].onMainDestroy(); singletons[i].onMainDestroy();

View file

@ -32,27 +32,16 @@ package org.godotengine.godot.input;
import org.godotengine.godot.*; import org.godotengine.godot.*;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.text.InputFilter; import android.text.InputFilter;
import android.text.InputType; import android.text.InputType;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.Gravity;
import android.view.KeyEvent; 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.EditorInfo;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.EditText; import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.PopupWindow;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
@ -67,8 +56,6 @@ public class GodotEditText extends EditText {
// Fields // Fields
// =========================================================== // ===========================================================
private GodotView mView; private GodotView mView;
private View mKeyboardView;
private PopupWindow mKeyboardWindow;
private GodotTextInputWrapper mInputWrapper; private GodotTextInputWrapper mInputWrapper;
private EditHandler sHandler = new EditHandler(this); private EditHandler sHandler = new EditHandler(this);
private String mOriginText; private String mOriginText;
@ -93,52 +80,24 @@ public class GodotEditText extends EditText {
// =========================================================== // ===========================================================
// Constructors // Constructors
// =========================================================== // ===========================================================
public GodotEditText(final Context context, final GodotView view) { public GodotEditText(final Context context) {
super(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 void onInitView() { public GodotEditText(final Context context, final AttributeSet attrs) {
mKeyboardWindow.showAtLocation(mView, Gravity.NO_GRAVITY, 0, 0); super(context, attrs);
this.initView();
} }
public void onDestroyView() { public GodotEditText(final Context context, final AttributeSet attrs, final int defStyle) {
mKeyboardWindow.dismiss(); 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() { public boolean isMultiline() {
@ -170,7 +129,7 @@ public class GodotEditText extends EditText {
edit.mInputWrapper.setOriginText(text); edit.mInputWrapper.setOriginText(text);
edit.addTextChangedListener(edit.mInputWrapper); 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); imm.showSoftInput(edit, 0);
} }
} break; } break;
@ -179,7 +138,7 @@ public class GodotEditText extends EditText {
GodotEditText edit = (GodotEditText)msg.obj; GodotEditText edit = (GodotEditText)msg.obj;
edit.removeTextChangedListener(mInputWrapper); 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); imm.hideSoftInputFromWindow(edit.getWindowToken(), 0);
edit.mView.requestFocus(); edit.mView.requestFocus();
} break; } break;
@ -192,6 +151,17 @@ public class GodotEditText extends EditText {
p_edit_text.setFilters(filters); 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 // Methods for/from SuperClass/Interfaces
// =========================================================== // ===========================================================

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 951 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 7 KiB

View file

@ -153,8 +153,8 @@ bool JoypadWindows::setup_dinput_joypad(const DIDEVICEINSTANCE *instance) {
if (have_device(instance->guidInstance) || num == -1) if (have_device(instance->guidInstance) || num == -1)
return false; return false;
d_joypads[joypad_count] = dinput_gamepad(); d_joypads[num] = dinput_gamepad();
dinput_gamepad *joy = &d_joypads[joypad_count]; dinput_gamepad *joy = &d_joypads[num];
const DWORD devtype = (instance->dwDevType & 0xFF); const DWORD devtype = (instance->dwDevType & 0xFF);
@ -178,7 +178,7 @@ bool JoypadWindows::setup_dinput_joypad(const DIDEVICEINSTANCE *instance) {
WORD version = 0; WORD version = 0;
sprintf_s(uid, "%04x%04x%04x%04x%04x%04x%04x%04x", type, 0, vendor, 0, product, 0, 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; slider_count = 0;
joy->di_joy->SetDataFormat(&c_dfDIJoystick2); joy->di_joy->SetDataFormat(&c_dfDIJoystick2);

View file

@ -188,7 +188,7 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int &
if (p_mode != PROCESS_CACHE && align != ALIGN_FILL) if (p_mode != PROCESS_CACHE && align != ALIGN_FILL)
wofs += line_ofs; wofs += line_ofs;
int begin = wofs; int begin = margin;
Ref<Font> cfont = _find_font(it); Ref<Font> cfont = _find_font(it);
if (cfont.is_null()) if (cfont.is_null())

View file

@ -2873,6 +2873,7 @@ void Node::_bind_methods() {
BIND_CONSTANT(NOTIFICATION_PATH_CHANGED); BIND_CONSTANT(NOTIFICATION_PATH_CHANGED);
BIND_CONSTANT(NOTIFICATION_INTERNAL_PROCESS); BIND_CONSTANT(NOTIFICATION_INTERNAL_PROCESS);
BIND_CONSTANT(NOTIFICATION_INTERNAL_PHYSICS_PROCESS); BIND_CONSTANT(NOTIFICATION_INTERNAL_PHYSICS_PROCESS);
BIND_CONSTANT(NOTIFICATION_POST_ENTER_TREE);
BIND_CONSTANT(NOTIFICATION_WM_MOUSE_ENTER); BIND_CONSTANT(NOTIFICATION_WM_MOUSE_ENTER);
BIND_CONSTANT(NOTIFICATION_WM_MOUSE_EXIT); BIND_CONSTANT(NOTIFICATION_WM_MOUSE_EXIT);