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:
commit
13a615bd9c
9
.mailmap
9
.mailmap
|
@ -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> <AlexHolly>
|
||||
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>
|
||||
Anutrix <numaanzaheerahmed@yahoo.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>
|
||||
Leon Krause <lk@leonkrause.com> <eska@eska.me>
|
||||
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>
|
||||
Marcelo Fernandez <marcelofg55@gmail.com>
|
||||
Marcin Zawiejski <dragmz@gmail.com>
|
||||
|
|
|
@ -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)
|
||||
|
|
220
DONORS.md
220
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
|
||||
|
|
54
README.md
54
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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"]);
|
||||
}
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
|
@ -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();
|
||||
|
|
|
@ -32,27 +32,16 @@ package org.godotengine.godot.input;
|
|||
|
||||
import org.godotengine.godot.*;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.text.InputFilter;
|
||||
import android.text.InputType;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.Gravity;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewGroup.LayoutParams;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.view.WindowManager;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.EditText;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.PopupWindow;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
|
@ -67,8 +56,6 @@ public class GodotEditText extends EditText {
|
|||
// Fields
|
||||
// ===========================================================
|
||||
private GodotView mView;
|
||||
private View mKeyboardView;
|
||||
private PopupWindow mKeyboardWindow;
|
||||
private GodotTextInputWrapper mInputWrapper;
|
||||
private EditHandler sHandler = new EditHandler(this);
|
||||
private String mOriginText;
|
||||
|
@ -93,52 +80,24 @@ public class GodotEditText extends EditText {
|
|||
// ===========================================================
|
||||
// Constructors
|
||||
// ===========================================================
|
||||
public GodotEditText(final Context context, final GodotView view) {
|
||||
public GodotEditText(final Context context) {
|
||||
super(context);
|
||||
|
||||
setPadding(0, 0, 0, 0);
|
||||
setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_ACTION_DONE);
|
||||
setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
|
||||
|
||||
mView = view;
|
||||
mInputWrapper = new GodotTextInputWrapper(mView, this);
|
||||
setOnEditorActionListener(mInputWrapper);
|
||||
view.requestFocus();
|
||||
|
||||
// Create a popup window with an invisible layout for the virtual keyboard,
|
||||
// so the view can be resized to get the vk height without resizing the main godot view.
|
||||
final FrameLayout keyboardLayout = new FrameLayout(context);
|
||||
keyboardLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
|
||||
keyboardLayout.setVisibility(View.INVISIBLE);
|
||||
keyboardLayout.addView(this);
|
||||
mKeyboardView = keyboardLayout;
|
||||
|
||||
mKeyboardWindow = new PopupWindow(keyboardLayout, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
|
||||
mKeyboardWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
|
||||
mKeyboardWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
|
||||
mKeyboardWindow.setFocusable(true); // for the text edit to work
|
||||
mKeyboardWindow.setTouchable(false); // inputs need to go through
|
||||
|
||||
keyboardLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
|
||||
@Override
|
||||
public void onGlobalLayout() {
|
||||
Point fullSize = new Point();
|
||||
((Activity)mView.getContext()).getWindowManager().getDefaultDisplay().getSize(fullSize);
|
||||
Rect gameSize = new Rect();
|
||||
mKeyboardWindow.getContentView().getWindowVisibleDisplayFrame(gameSize);
|
||||
|
||||
final int keyboardHeight = fullSize.y - gameSize.bottom;
|
||||
GodotLib.setVirtualKeyboardHeight(keyboardHeight);
|
||||
}
|
||||
});
|
||||
this.initView();
|
||||
}
|
||||
|
||||
public void onInitView() {
|
||||
mKeyboardWindow.showAtLocation(mView, Gravity.NO_GRAVITY, 0, 0);
|
||||
public GodotEditText(final Context context, final AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
this.initView();
|
||||
}
|
||||
|
||||
public void onDestroyView() {
|
||||
mKeyboardWindow.dismiss();
|
||||
public GodotEditText(final Context context, final AttributeSet attrs, final int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
this.initView();
|
||||
}
|
||||
|
||||
protected void initView() {
|
||||
this.setPadding(0, 0, 0, 0);
|
||||
this.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_ACTION_DONE);
|
||||
}
|
||||
|
||||
public boolean isMultiline() {
|
||||
|
@ -170,7 +129,7 @@ public class GodotEditText extends EditText {
|
|||
|
||||
edit.mInputWrapper.setOriginText(text);
|
||||
edit.addTextChangedListener(edit.mInputWrapper);
|
||||
final InputMethodManager imm = (InputMethodManager)mKeyboardView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
final InputMethodManager imm = (InputMethodManager)mView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.showSoftInput(edit, 0);
|
||||
}
|
||||
} break;
|
||||
|
@ -179,7 +138,7 @@ public class GodotEditText extends EditText {
|
|||
GodotEditText edit = (GodotEditText)msg.obj;
|
||||
|
||||
edit.removeTextChangedListener(mInputWrapper);
|
||||
final InputMethodManager imm = (InputMethodManager)mKeyboardView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
final InputMethodManager imm = (InputMethodManager)mView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.hideSoftInputFromWindow(edit.getWindowToken(), 0);
|
||||
edit.mView.requestFocus();
|
||||
} break;
|
||||
|
@ -192,6 +151,17 @@ public class GodotEditText extends EditText {
|
|||
p_edit_text.setFilters(filters);
|
||||
}
|
||||
|
||||
// ===========================================================
|
||||
// Getter & Setter
|
||||
// ===========================================================
|
||||
public void setView(final GodotView view) {
|
||||
this.mView = view;
|
||||
if (mInputWrapper == null)
|
||||
mInputWrapper = new GodotTextInputWrapper(mView, this);
|
||||
this.setOnEditorActionListener(mInputWrapper);
|
||||
view.requestFocus();
|
||||
}
|
||||
|
||||
// ===========================================================
|
||||
// Methods for/from SuperClass/Interfaces
|
||||
// ===========================================================
|
||||
|
|
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.0 KiB |
|
@ -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);
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue